home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / hardware / setcpu13.1 < prev   
Text File  |  1989-02-04  |  27KB  |  764 lines

  1. Path: xanth!ames!ncar!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i018:  setcpu - display cpu & set cache v1.3
  5. Message-ID: <11564@swan.ulowell.edu>
  6. Date: 4 Feb 89 05:00:51 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 753
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: cbmvax!daveh (Dave Haynie)
  12. Posting-number: Volume 89, Issue 18
  13. Archive-name: hardware/setcpu13.1
  14.  
  15. #    This is a shell archive.
  16. #    Remove everything above and including the cut line.
  17. #    Then run the rest of the file through sh.
  18. #----cut here-----cut here-----cut here-----cut here----#
  19. #!/bin/sh
  20. # shar:    Shell Archiver
  21. #    Run the following text with /bin/sh to create:
  22. #    SetCPU.c
  23. #    030Stuff.a
  24. #    makefile
  25. #    SetCPU.uu
  26. # This archive created: Mon Jan 30 19:18:27 1989
  27. cat << \SHAR_EOF > SetCPU.c
  28. /*
  29.     SetCPU V1.3
  30.     by Dave Haynie (released to the public domain)
  31.  
  32.     MAIN PROGRAM
  33.  
  34.     This program tells which Motorola CPU is in place, and allows the
  35.     some cache control on 68020 and 68030 machines.  It also sets up
  36.     the ExecBase->AttnFlags with 68030 information, so that any
  37.     subsequent program can use the standard methods to identify if the
  38.     system is a 68030 system.
  39.     
  40.     The program now defaults to WALLOC mode for '030 data cache, since
  41.     that's the proper mode for Amiga data caches (user and supervisor
  42.     modes share data).
  43.     
  44.     I now check for the existence of an MMU, and allow for testing of 
  45.     different CPUs, for use in CLI scripts and that kind of thing.
  46.     Apparently some 68020 boards out there don't fully decode CPU space
  47.     addresses, and, as a result, their math chip shows up in all 8
  48.     coprocessor slots.  This makes the MMU test hang, since instead of
  49.     getting no MMU, I get instead an FPU responding to an MMU 
  50.     instruction, which will probably hang the system.  The "NOMMUTEST"
  51.     option allows for the rest of this program to work on such a 
  52.     board.
  53. */
  54.  
  55. #include <exec/types.h>
  56. #include <exec/execbase.h>
  57. #include <exec/nodes.h>
  58. #include <exec/interrupts.h>
  59. #include <functions.h>
  60. #include <stdio.h>
  61.  
  62. /* Define a few flags missing from AmigaOS 1.2 */
  63.  
  64. #define AFB_68030    2L
  65. #define AFF_68030    (1L<<2)
  66.  
  67. /* Define all CACR bit components, not all are actually used here. */
  68.  
  69. #define CACR_INST    (1L<<0)
  70. #define CACR_DATA    (1L<<8)
  71.  
  72. #define CACR_WALLOC    5
  73. #define CACR_BURST    4
  74. #define CACR_CLEAR    3
  75. #define CACR_ENTRY    2
  76. #define CACR_FREEZE    1
  77. #define CACR_ENABLE    0
  78.  
  79. /* ====================================================================== */
  80.  
  81. /* Some external declarations. */
  82.  
  83. void SetCACR();
  84. ULONG GetCACR(), GetCPUType(), GetMMUType(), GetFPUType();
  85.  
  86. /* Checking array */
  87.  
  88. #define    CK68000    0
  89. #define CK68010    1
  90. #define CK68020    2
  91. #define CK68030    3
  92. #define CK68851    4
  93. #define CK68881    5
  94. #define CK68882    6
  95. #define CHECKS    7
  96.  
  97. struct checker { LONG item; BOOL tag; };
  98.  
  99. struct checker checks[CHECKS] = {
  100.    { 68000L, FALSE },
  101.    { 68010L, FALSE },
  102.    { 68020L, FALSE },
  103.    { 68030L, FALSE },
  104.    { 68851L, FALSE },
  105.    { 68881L, FALSE },
  106.    { 68882L, FALSE }
  107. };
  108.  
  109. USHORT code = 0L;    /* Program return code */
  110.  
  111. /* ====================================================================== */
  112.  
  113. /* This replaces the Lattice "stricmp()" function, plus it's a better form
  114.    for my needs here. */
  115.    
  116. BOOL striequ(s1,s2)
  117. char *s1,*s2;
  118. {
  119.    while (*s1 && *s2 && (*s1++ & 0xdf) == (*s2++ & 0xdf));
  120.    return (BOOL) (!*s1 && (*s1 & 0xdf) == (*s2 & 0xdf));
  121. }
  122.  
  123. /* This routine prints FPU codes and sets things accordingly. */
  124.  
  125. void PrintFPU(fpu)
  126. ULONG fpu;
  127. {
  128.    if (fpu == 68881L) {
  129.       printf("68881 ");
  130.       if (checks[CK68881].item) code = 0;
  131.    } else if (fpu == 68882L) {
  132.       printf("68882 ");
  133.       if (checks[CK68882].item) code = 0;
  134.    }
  135. }
  136.  
  137. /* This be the main program. */
  138.  
  139. void main(argc,argv)
  140. int argc;
  141. char *argv[];
  142. {
  143.    BOOL worked, dommutest = TRUE;
  144.    ULONG cacr,op,mode,test,cpu,fpu,mmu = 0;
  145.    USHORT i,j;
  146.  
  147.    /* If they're just asking for help */
  148.  
  149.    if (argc >= 2 && argv[1][0] == '?') {
  150.       printf("\2337mSetCPU 1.3 by Dave Haynie\2330m\n");
  151.       printf("Usage: SetCPU [INST|DATA] [[NO]CACHE|[NO]BURST] [NOMMUTEST]\n");
  152.       printf("              [CHECK 68000|68010|68020|68030|68851|68881|68882]\n");
  153.       exit(0);
  154.    }
  155.  
  156.   /* Now we parse the command line.  The default cache operation acts on 
  157.      both data and instruction caches.  The way all the cache control
  158.      functions are defined, they're just NOPs on machines without the
  159.      appropriate caches. */
  160.    
  161.    mode = CACR_INST | CACR_DATA;
  162.    cacr = GetCACR();
  163.  
  164.    if (argc > 1) {
  165.       for (i = 1; i < argc; ++i) {
  166.          if (striequ(argv[i],"CHECK")) {
  167.             code = 5;
  168.             while (argv[++i][0]=='6' && argv[i][1]=='8' && strlen(argv[i])==5) {
  169.                worked = FALSE;
  170.                sscanf(argv[i],"%ld",&test);
  171.                for (j = 0; j < CHECKS; ++j)
  172.                   if (checks[j].item == test) {
  173.                      checks[j].tag = TRUE;
  174.                      worked = TRUE;
  175.                   }
  176.                if (!worked) {
  177.                   printf("Error: Illegal Check Parameter \"%s\"\n",argv[i]);
  178.                   exit(10);
  179.                }
  180.             }
  181.          }
  182.          if (striequ(argv[i],"NOMMUTEST")) { dommutest = FALSE; ++i; }
  183.          if (striequ(argv[i],"DATA")) {    mode = CACR_DATA; ++i; }
  184.          if (striequ(argv[i],"INST")) { mode = CACR_INST; ++i; }
  185.          
  186.          if (striequ(argv[i],"CACHE") || striequ(argv[i],"NOCACHE"))
  187.             op = mode << CACR_ENABLE;
  188.          else if (striequ(argv[i],"BURST") || striequ(argv[i],"NOBURST"))
  189.             op = mode << CACR_BURST;
  190.          else {
  191.             if (argv[i][0] == 0) continue;
  192.             printf("Error: Illegal Cache Parameter \"%s\"\n",argv[i]);
  193.             exit(10);
  194.          }
  195.          argv[i][2] = '\0';
  196.          if (striequ(argv[i],"NO")) cacr &= ~op; else cacr |= op;
  197.       }
  198.  
  199.      /* We ALWAYs want to be in Word Allocate mode, AmigaOS won't run 
  200.         otherwise. */
  201.  
  202.       SetCACR(cacr | CACR_DATA << CACR_WALLOC);
  203.    }
  204.  
  205.   /* Let's find out what we have */
  206.  
  207.    cpu = GetCPUType();
  208.    fpu = GetFPUType();
  209.    if (dommutest) mmu = GetMMUType();
  210.  
  211.    printf("SYSTEM: ");
  212.  
  213.    /* If they're not on a 68020/68030, we can't set anything.  For 
  214.       compatibility across systems, I don't consider a cache setting 
  215.       request an error, just ignore it. */
  216.  
  217.    if (cpu <= 68010L) {
  218.       if (cpu == 68010L) {
  219.          printf("68010 ");
  220.          if (checks[CK68010].item) code = 0;
  221.       } else {
  222.          printf("68000 ");
  223.          if (checks[CK68000].item) code = 0;
  224.       }
  225.       PrintFPU(fpu);
  226.       printf("\n");
  227.       exit(code);
  228.    }
  229.  
  230.    /* Now we're on a 32 bit system.  But EXEC doesn't know which.  If you
  231.       run SetCPU on a 68030 system once, the '030 flag's set, otherwise, 
  232.       we'll test for it. */
  233.  
  234.    if (cpu == 68030L) {
  235.       printf("68030 ");
  236.       if (checks[CK68030].item) code = 0;
  237.    } else {
  238.       printf("68020 ");
  239.       if (checks[CK68020].item) code = 0;
  240.    }
  241.  
  242.    PrintFPU(fpu);
  243.  
  244.    if (mmu == 68851L) {
  245.       printf("68851 ");
  246.       if (checks[CK68851].item) code = 0;
  247.    }
  248.    
  249.    /* We always print the results, even if nothing has changed. */
  250.    
  251.    cacr = GetCACR();
  252.    printf("(INST: ");
  253.    if (!(cacr & (CACR_INST << CACR_ENABLE))) printf("NO");
  254.    printf("CACHE");
  255.  
  256.    if (cpu == 68030L) {
  257.       printf(" ");
  258.       if (!(cacr & (CACR_INST << CACR_BURST))) printf("NO");
  259.       printf("BURST) (DATA: ");
  260.       if (!(cacr & (CACR_DATA << CACR_ENABLE))) 
  261.          printf("NOCACHE ");
  262.       else
  263.          printf("CACHE ");
  264.  
  265.       if (!(cacr & (CACR_DATA << CACR_BURST))) printf("NO");
  266.       printf("BURST");
  267.    }
  268.    printf(")\n");
  269.  
  270.    /* For safety's sake, or personal paranoia, or whatever, I dump the
  271.       data cache before I go away. */
  272.  
  273.    if (cpu = 68030L) SetCACR(cacr|(CACR_DATA << CACR_CLEAR));
  274.    exit(code);
  275. }
  276.  
  277. SHAR_EOF
  278. cat << \SHAR_EOF > 030Stuff.a
  279. ;======================================================================
  280. ;
  281. ;    SetCPU V1.3
  282. ;    by Dave Haynie (released to the public domain)
  283. ;
  284. ;    68030 Assembly Function Module
  285. ;
  286. ;    This module contains functions that access the 68030 cache
  287. ;    and run a few tests.
  288. ;
  289. ;======================================================================
  290.  
  291. ;======================================================================
  292. ;
  293. ;    Macros & constants used herein...
  294. ;
  295. ;======================================================================
  296.  
  297. CALLSYS macro   *
  298.     jsr     LVO\1(A6)
  299.     endm
  300.  
  301. CIB_ENABLE    EQU    0
  302. CIB_FREEZE    EQU    1
  303. CIB_ENTRY    EQU    2
  304. CIB_CLEAR    EQU    3
  305. CIB_BURST    EQU    4
  306.  
  307. CDB_ENABLE    EQU    8
  308. CDB_FREEZE    EQU    9
  309. CDB_ENTRY    EQU    10
  310. CDB_CLEAR    EQU    11
  311. CDB_BURST    EQU    12
  312. CDB_WALLOC    EQU    13
  313.  
  314. AFB_68030    EQU    2
  315.  
  316. ATNFLGS        EQU    $129
  317.  
  318. LVOSupervisor    EQU    -30
  319. LVOFindTask    EQU    -294
  320. LVOAllocTrap    EQU    -342
  321. LVOFreeTrap    EQU    -348
  322.  
  323. ;======================================================================
  324. ;
  325. ;    Need just a little more stuff
  326. ;
  327. ;======================================================================
  328.  
  329.     NOLIST
  330.     include "exec/execbase.i"
  331.     include "exec/tasks.i"
  332.     LIST
  333.  
  334.     machine mc68020
  335.         mc68881
  336.     cseg
  337.  
  338.     public    _GetCACR
  339.     public    _SetCACR
  340.     public    _GetMMUType
  341.     public    _GetCPUType
  342.     public    _GetFPUType
  343.  
  344. ;======================================================================
  345. ;
  346. ;    This function returns the 68020/68030 CACR register.  It assumes
  347. ;    a 68020 or 68030 based system.
  348. ;
  349. ;    ULONG GetCACR()
  350. ;
  351. ;======================================================================
  352.  
  353. _GetCACR:
  354.     move.l    4,a6            ; Get ExecBase
  355.     btst.b    #AFB_68020,ATNFLGS(a6)    ; Does the OS think an '020 is here?
  356.     bne    1$
  357.     moveq.l    #0,d0            ; No CACR here, pal
  358.     rts
  359. 1$
  360.     move.l    a5,-(sp)        ; Save this register
  361.     lea    2$,a5            ; Get the start of the supervisor code
  362.     CALLSYS    Supervisor
  363.     move.l    (sp)+,a5        ; Give back registers
  364.     rts
  365. 2$
  366.     movec    cacr,d0            ; Make CACR the return value
  367.     rte
  368.  
  369. ;======================================================================
  370. ;
  371. ;    This function sets the value of the 68020/68030 CACR register.  
  372. ;    It assumes a 68020 or 68030 based system.
  373. ;
  374. ;    void SetCACR(cacr)
  375. ;    ULONG cacr;
  376. ;
  377. ;======================================================================
  378.  
  379. _SetCACR:
  380.     move.l    4(sp),d0        ; New CACR is on stack
  381.     move.l    4,a6            ; Get ExecBase
  382.     btst.b    #AFB_68020,ATNFLGS(a6)    ; Does the OS think an '020 is here?
  383.     bne    1$
  384.     rts                ; No CACR here, pal
  385. 1$
  386.     move.l    a5,-(sp)        ; Save this register
  387.     lea    2$,a5            ; Get the start of the supervisor code
  388.     CALLSYS    Supervisor
  389.     move.l    (sp)+,a5        ; Give back register
  390.     rts
  391. 2$
  392.     movec    d0,cacr            ; Set the CACR
  393.     rte
  394.  
  395. ;======================================================================
  396. ;
  397. ;    This function returns the type of the CPU in the system as a
  398. ;    longword: 68000, 68010, 68020, or 68030.  The testing must be done
  399. ;    in reverse order, in that any higher CPU also has the bits set for
  400. ;    a lower CPU.  Also, since 1.3 doesn't recognize the 68030, if I
  401. ;    find the 68020 bit set, I always check for the presence of a 
  402. ;    68030.
  403. ;
  404. ;    This routine should be the first test routine called under 1.2
  405. ;    and 1.3.
  406. ;
  407. ;    ULONG GetCPUType();
  408. ;
  409. ;======================================================================
  410.  
  411. _GetCPUType:
  412.     movem.l    a4/a5,-(sp)        ; Save this register
  413.     move.l    4,a6            ; Get ExecBase
  414.     btst.b    #AFB_68030,ATNFLGS(a6)    ; Does the OS think an '030 is here?
  415.     beq    0$
  416.     move.l    #68030,d0        ; Sure does...
  417.     movem.l    (sp)+,a4/a5
  418.     rts
  419. 0$
  420.     btst.b    #AFB_68020,ATNFLGS(a6)    ; Maybe a 68020
  421.     bne    2$
  422.     btst.b    #AFB_68010,ATNFLGS(a6)    ; Maybe a 68010?
  423.     bne    1$
  424.     move.l    #68000,d0        ; Just a measley '000
  425.     movem.l    (sp)+,a4/a5
  426.     rts
  427. 1$
  428.     move.l    #68010,d0        ; Yup, we're an '010
  429.     movem.l    (sp)+,a4/a5
  430.     rts
  431. 2$
  432.     move.l    #68020,d0        ; Assume we're an '020
  433.     lea    3$,a5            ; Get the start of the supervisor code
  434.     CALLSYS    Supervisor
  435.     movem.l    (sp)+,a4/a5
  436.     rts
  437. 3$
  438.     movec    cacr,d1            ; Get the cache register
  439.     move.l    d1,a4            ; Save it for a minute
  440.     bset.l    #CIB_BURST,d1        ; Set the inst burst bit
  441.     bclr.l    #CIB_ENABLE,d1        ; Clear the inst cache bit
  442.     movec    d1,cacr            ; Try to set the CACR
  443.     movec    cacr,d1
  444.     btst.l    #CIB_BURST,d1        ; Do we have a set burst bit?
  445.     beq    4$
  446.     move.l    #68030,d0        ; It's a 68030
  447.     bset.b    #AFB_68030,ATNFLGS(a6)
  448. 4$
  449.     move.l    a4,d1            ; Restore the original CACR
  450.     movec    d1,cacr
  451.     rte
  452.  
  453. ;======================================================================
  454. ;
  455. ;    This function returns 0L if the system contains no MMU, 
  456. ;    68851L if the system does contain an 68851, or 68030L if the
  457. ;    system contains a 68030.
  458. ;
  459. ;    This routine seems to lock up on at least some CSA 68020 
  460. ;    boards, though it runs just fine on those from Ronin and 
  461. ;    Commodore, as well as all 68030 boards it's been tested on.
  462. ;
  463. ;    ULONG GetMMUType()
  464. ;
  465. ;======================================================================
  466.  
  467. _GetMMUType:
  468.     move.l    4,a6            ; Get ExecBase
  469.     movem.l    a3/a4/a5,-(sp)        ; Save this stuff
  470.     move.l    #0,a1    
  471.     CALLSYS    FindTask        ; Call FindTask(0L)
  472.     move.l    d0,a3
  473.  
  474.     move.l    TC_TRAPCODE(a3),a4    ; Change the exception vector
  475.     move.l    #2$,TC_TRAPCODE(a3)
  476.     
  477.     subq.l    #4,sp            ; Let's try an MMU instruction
  478.     dc.w    $f017            ; Slimey PMOVE tc,(sp)
  479.     dc.w    $4200
  480.     cmpi    #0,d0            ; Any MMU here?
  481.     beq    1$
  482.     btst.b    #AFB_68030,ATNFLGS(a6)    ; Does the OS think an '030 is here?
  483.     beq    1$
  484.     move.l    #68030,d0
  485.  
  486. 1$
  487.     addq.l    #4,sp            ; Return that local
  488.     move.l    a4,TC_TRAPCODE(a3)    ; Reset exception stuff
  489.     movem.l    (sp)+,a3/a4/a5        ; and return the registers
  490.     rts
  491.  
  492.     ; This is the exception code.  No matter what machine we're on,
  493.     ; we get an exception.  If the MMU's in place, we should get a
  494.     ; privilige violation; if not, an F-Line emulation exception.
  495. 2$
  496.     move.l    (sp)+,d0        ; Get Amiga supplied exception #
  497.     cmpi    #11,d0            ; Is it an F-Line?
  498.     beq    3$            ; If so, go to the fail routine
  499.     move.l    #68851,d0        ; We have MMU
  500.     addq.l    #4,2(sp)        ; Skip the MMU instruction
  501.     rte
  502. 3$
  503.     moveq.l    #0,d0            ; It dinna woik,
  504.     addq.l    #4,2(sp)        ; Skip the MMU instruction
  505.     rte
  506.  
  507. ;======================================================================
  508. ;
  509. ;    This function returns the type of the FPU in the system as a
  510. ;    longword: 0 (no FPU), 68881, or 68882.
  511. ;
  512. ;    ULONG GetFPUType();
  513. ;
  514. ;======================================================================
  515.  
  516. _GetFPUType:
  517.     move.l    a5,-(sp)        ; Save this register
  518.     move.l    4,a6            ; Get ExecBase
  519.     btst.b    #AFB_68881,ATNFLGS(a6)    ; Does the OS think an FPU is here?
  520.     bne    1$    
  521.     moveq.l    #0,d0            ; No FPU here, dude
  522.     move.l    (sp)+,a5        ; Give back the register
  523.     rts
  524. 1$
  525.     lea    2$,a5            ; Get the start of the supervisor code
  526.     CALLSYS    Supervisor
  527.     move.l    (sp)+,a5        ; Give back registers
  528.     rts
  529. 2$
  530.     move.l    #68881,d0        ; Assume we're a 68881
  531.     fsave    -(sp)            ; Test and check
  532.     moveq.l    #0,d1
  533.     move.b    1(sp),d1        ; Size of this frame
  534.     cmpi    #$18,d1
  535.     beq 3$
  536.     move.l    #68882,d0        ; It's a 68882
  537. 3$
  538.     frestore (sp)+            ; Restore the stack
  539.     rte
  540.  
  541.     end
  542. SHAR_EOF
  543. cat << \SHAR_EOF > makefile
  544. ######################################################################
  545. #
  546. # Makefile for SetCPU V1.3
  547. #
  548. ######################################################################
  549.  
  550. .a.o:
  551.     as -o $@ $*.a
  552.  
  553. CFLAGS    = +x5 
  554. LFLAGS    = -lc
  555.  
  556. OBJS    = 030stuff.o setcpu.o
  557.  
  558. SetCPU:        $(OBJS)
  559.         ln $(OBJS) -o SetCPU $(LFLAGS)
  560.  
  561. SHAR_EOF
  562. cat << \SHAR_EOF > SetCPU.uu
  563.  
  564. begin 644 SetCPU
  565. M```#\P`````````#``````````(```>*````PP````$```/I```'BD[Z#8`L.
  566. M>``$""X``0$I9@1P`$YU+PU+^@`*3J[_XBI?3G5.>@`"3G,@+P`$+'@`!`@NJ
  567. M``$!*68"3G4O#4OZ``I.KO_B*E].=4Y[``).<TCG``PL>``$""X``@$I9PP@N
  568. M/``!";Y,WS``3G4(+@`!`2EF(`@N```!*68,(#P``0F@3-\P`$YU(#P``0FJ/
  569. M3-\P`$YU(#P``0FT2_H`#$ZN_^),WS``3G5.>A`"*$$(P0`$"($``$Y[$`).&
  570. M>A`""`$`!&<,(#P``0F^".X``@$I(@Q.>Q`"3G,L>``$2.<`'")\`````$ZNI
  571. M_MHF0"AK`#(G?````1P`,EF/\!="``Q```!G#@@N``(!*6<&(#P``0F^6(\GH
  572. M3``R3-\X`$YU(!\,0``+9PP@/``!#/-8KP`"3G-P`%BO``).<R\-+'@`!`@NG
  573. M``0!*68&<``J7TYU2_H`"DZN_^(J7TYU(#P``0T1\R=R`!(O``$,00`89P8@)
  574. M/``!#1+S7TYS3E4``"!M``A*$&<N(&T`#$H09R8@;0`(4JT`"!`02(#`?`#?U
  575. M(&T`#%*M``P2$$B!PGP`W[!!9@)@RB!M``A*$&8@(&T`"!`02(#`?`#?(&T`)
  576. M#!(02('"?`#?L$%F!'`!8`)P`$Y=3G5.50``#*T``0T1``AF%DAZ`#9.NA`N=
  577. M6$]*K(`@9P1";(`L8!X,K0`!#1(`"&842'H`'4ZZ$`Y83TJL@"9G!$)L@"Q.V
  578. M74YU-C@X.#$@`#8X.#@R(`!.5?_<.WP``?_\0JW_X`QM``(`"&TT(&T`"B)H#
  579. M``0,$0`_9B9(>@2F3KH/Q%A/2'H$O4ZZ#[I83TAZ!/!.N@^P6$]"9TZZ&/14*
  580. M3RM\```!`?_P3KK]?BM`__@,;0`!``AO``+`.WP``?_>8``"FDAZ!/MP`#`M>
  581. M_][E@"!M``HO,`@`3KK^P%!/2D!G``#P.7P`!8`L4FW_WG``,"W_WN6`(&T`D
  582. M"B)P"``,$0`V9@``SG``,"W_WN6`(&T`"B)P"``,*0`X``%F``"T<``P+?_>=
  583. MY8`@;0`*(G`(`"`)2AEF_)/`4XFR_``%9@``DD)M__Y(;?_L2'H$>W``,"W_W
  584. MWN6`(&T`"B\P"`!.N@583^\`#$)M_]PP+?_<P/P`!D'L@`(B,`@`LJW_[&88%
  585. M,"W_W,#\``9![(`&,;P``0@`.WP``?_^4FW_W`QM``?_W&7&2FW__F8D<``P6
  586. M+?_>Y8`@;0`*+S`(`$AZ!`].N@Z$4$\_/``*3KH7QE1/8`#_&DAZ!!QP`#`MP
  587. M_][E@"!M``HO,`@`3KK]LE!/2D!G"$)M__Q2;?_>2'H$`'``,"W_WN6`(&T`W
  588. M"B\P"`!.NOV,4$]*0&<,*WP```$`__!2;?_>2'H#VW``,"W_WN6`(&T`"B\PV
  589. M"`!.NOUB4$]*0&<,*WP````!__!2;?_>2'H#MG``,"W_WN6`(&T`"B\P"`!.4
  590. MNOTX4$]*0&8>2'H#GG``,"W_WN6`(&T`"B\P"`!.NOT:4$]*0&<**VW_\/_T_
  591. M8```@DAZ`WYP`#`M_][E@"!M``HO,`@`3KK\\E!/2D!F'DAZ`V9P`#`M_][E/
  592. M@"!M``HO,`@`3KK\U%!/2D!G#"`M__#I@"M`__1@.'``,"W_WN6`(&T`"B)P%
  593. M"`!*$6=J<``P+?_>Y8`@;0`*+S`(`$AZ`R!.N@U`4$\_/``*3KH6@E1/<``P"
  594. M+?_>Y8`@;0`*(G`(`$(I``)(>@,=<``P+?_>Y8`@;0`*+S`(`$ZZ_%Y03TI`'
  595. M9PP@+?_T1H#!K?_X8`@@+?_T@:W_^%)M_]XP+?_>L&T`"&4`_5X@+?_X",``R
  596. M#2\`3KKZV%A/3KKZ^"M`_^A.NOO:*T#_Y$IM__QG"$ZZ^VHK0/_@2'H"L$ZZ(
  597. M#*A83PRM``$)JO_H8E(,K0`!":K_Z&862'H"FTZZ#(I83TJL@`AG!$)L@"Q@Z
  598. M%$AZ`HQ.N@QT6$]*K(`"9P1";(`L+RW_Y$ZZ_!Y83TAZ`G5.N@Q66$\_+(`LY
  599. M3KH5F%1/#*T``0F^_^AF%DAZ`EE.N@PX6$]*K(`49P1";(`L8!1(>@)*3KH,Q
  600. M(EA/2JR`#F<$0FR`+"\M_^1.NOO,6$\,K0`!#//_X&842'H"*4ZZ"_I83TJLP
  601. M@!IG!$)L@"Q.NOG.*T#_^$AZ`A1.N@O>6$\(+0``__MF"DAZ`@I.N@O,6$]([
  602. M>@(#3KH+PEA/#*T``0F^_^AF8$AZ`?5.N@NN6$\(+0`$__MF"DAZ`>5.N@N<#
  603. M6$](>@'>3KH+DEA/""T``/_Z9@Q(>@';3KH+@%A/8`I(>@'83KH+=%A/""T`T
  604. M!/_Z9@I(>@'-3KH+8EA/2'H!QDZZ"UA83TAZ`<).N@M.6$\K?``!";[_Z&<0.
  605. M("W_^`C```LO`$ZZ^3Q83S\L@"Q.NA1V5$].74YUFS=M4V5T0U!5(#$N,R!BK
  606. M>2!$879E($AA>6YI99LP;0H`57-A9V4Z(%-E=$-052!;24Y35'Q$051!72!;C
  607. M6TY/74-!0TA%?%M.3UU"55)35%T@6TY/34U55$535%T*`"`@("`@("`@("`@U
  608. M("`@6T-(14-+(#8X,#`P?#8X,#$P?#8X,#(P?#8X,#,P?#8X.#4Q?#8X.#@Q^
  609. M?#8X.#@R70H`0TA%0TL`)6QD`$5R<F]R.B!);&QE9V%L($-H96-K(%!A<F%MS
  610. M971E<B`B)7,B"@!.3TU-551%4U0`1$%400!)3E-4`$-!0TA%`$Y/0T%#2$4`?
  611. M0E524U0`3D]"55)35`!%<G)O<CH@26QL96=A;"!#86-H92!087)A;65T97(@P
  612. M(B5S(@H`3D\`4UE35$5-.B``-C@P,3`@`#8X,#`P(``*`#8X,#,P(``V.#`RZ
  613. M,"``-C@X-3$@`"A)3E-4.B``3D\`0T%#2$4`(`!.3P!"55)35"D@*$1!5$$Z_
  614. M(`!.3T-!0TA%(`!#04-(12``3D\`0E524U0`*0H``$Y5```I;0`(@K)"+(*V@
  615. M2&T`$"\M``Q(>@`.3KH`5$_O``Q.74YU3E4``$IM``AF)"!L@K)*$&<4(&R"@
  616. MLE*L@K(0$$B`P'P`_TY=3G49?``!@K9@&$HL@K9F$E.L@K(@;(*R$!!(@,!\X
  617. M`/]@W'#_8-A.5?]R2.</,"1M``PF;0`0>@`I;0`(@KH@2E**$!!(@#@`9P`"'
  618. MYKA\`"5F``*F0BW_^T(M__I"+?_Y.7P`?X*X#!(`*F8(4HH;?``!__L0$DB`!
  619. M4D!![(!N"#```@``9S1";(*X$!)(@#(L@KC#_``*T$&0?``P.4""N%**$!)([
  620. M@%)`0>R`;@@P``(``&;6&WP``?_Y#!(`;&8(&WP``?_Z4HH@2E**$!!(@#X`$
  621. M2,!@``'0>"5@``(T&WP`___Z8`8;?``!__IX#'P*8!8;?``!__IX`'P08`H;,
  622. M?``!__IX#GP(3KH"5$I`9@`"($AM__P_!C`$2,!![(!%T(@O`#`$2,!![(`NQ
  623. MT(@O`$ZZ`F9*0$_O``YG``'T2BW_^V8P2BW_^FP,($M8BR)0,JW__F`<2BW_F
  624. M^F\,($M8BR)0(JW__&`*($M8BR)0,JW__E)%8``!@$(M__H,$@!>9P8,$@!^J
  625. M9@A2BAM\``'_^D'M_W(K2/_T8`H@;?_T4JW_]!"$($I2BA`02(`X`+!\`%UFE
  626. MYB!M__1"$&`<&WP``?_Z&WP`(/]R&WP`"?]S&WP`"O]T0BW_=4ZZ`81*0&8`S
  627. M`5!*+?_[9@@@2UB+*U#_]$(M__DP+(*X4VR"N$I`9VY"9R!L@KI.D#@`L'S_S
  628. M_U1/9UQ*+?_Z9Q@_!$AM_W).N@)J2H!<3V<$<`%@`G``8!8_!$AM_W).N@)2/
  629. M2H!<3V8$<`%@`G``9PX_/``!(&R"NDZ05$]@&$HM__MF"B!M__12K?_T$(0;6
  630. M?``!__E@ADHM__EG``"\2BW_^V8.OGP`8V<&(&W_]$(04D5@:DHM__EF!CE\?
  631. M``&"N$(M_W(;?``!__I@`/\^D+P````E9P#^*I"\````'V<`_BZ0O`````MG%
  632. M`/X\D+P````)9P#^)E>`9P#^IE&`9[13@&<`_A!9@&<`_?Q?@&<`_AQ9@&<`)
  633. M_LY;@&<`_@1@-#`$4D!![(!N"#``!```9PAA5$I`9B)@'$)G(&R"NDZ0L$14*
  634. M3V<./SP``2!L@KI.D%1/8`1@`/T02D5F)D)G(&R"NDZ0L'S__U1/9@IP_TS?;
  635. M#/!.74YU/SP``2!L@KI.D%1/,`5@Z$Y5``!"9R!L@KI.D%)`0>R`;@@P``0`'
  636. M`%1/9P)@YC\\``$@;(*Z3I"P?/__5$]F!G#_3EU.=7``8/A.5?_Z2.<,($IL_
  637. M@KAN"G``3-\$,$Y=3G5";?_Z<``Z`$C`*T#__$)G(&R"NDZ0.`"P?``M5$]F8
  638. M"CM\``'_^E)%8!:X?``K9@1216`,/SP``2!L@KI.D%1/8'!"9R!L@KI.D%1/;
  639. M.``_`"\M``A.N@"$)$!*@%Q/9B@,;0`0`!!F$DJM__QF#+A\`'AG/+A\`%AG%
  640. M-C\\``$@;(*Z3I!43V`P,BT`$$C!("W__$ZZ!"8K0/_\(`J0K0`((&T`#!(PM
  641. M``!(@4C!TZW__%)%NFR"N&V*2FW_^F<.(&T`$B`M__Q$@""`8`@@;0`2(*W_^
  642. M_#`%8`#_("!O``0P+P`($AAG"K(`9O@@"%.`3G5P`$YU87!#[(*R1>R"LK7)=
  643. M9@XR/``6:PAT`"+"4<G__"E/@L(L>``$*4Z"QDCG@(`(+@`$`2EG$$OZ``A.@
  644. MKO_B8`9"I_-?3G-#^@`@3J[^:"E`@LIF#"X\``.`!TZN_Y1@!$ZZ`!I03TYU"
  645. M9&]S+FQI8G)A<GD`2?D``'_^3G5.50``+PI(>0`!```P+(*HP?P`!B\`3KH/8
  646. M>BE`@LY03V840J=(>0`!``!.N@\^4$\N;(+"3G4@;(+.0F@`!"!L@LXQ?``!@
  647. M`!`@;(+.,7P``0`*(&R"PB`L@L*0J``$4(`I0(+2(&R"TB"\34%.6$*G3KH/]
  648. M+B1`2JH`K%A/9RXO+0`,+RT`""\*3KH`KCE\``&"UB!L@LX`:(````0@;(+.;
  649. M`&B````*3^\`#&!"2&H`7$ZZ#TA(:@!<3KH/"BE`@M@@;(+82J@`)%!/9Q`@O
  650. M;(+8(F@`)"\13KH.*EA/+RR"V"\*3KH"C"EL@MB"W%!/3KH.*B!L@LX@@$ZZ/
  651. M#DH@;(+.(4``!F<62'@#[4AZ`"I.N@XF(&R"SB%```Q03R\L@MP_+(+@3KKS9
  652. M$$)G3KH,1%!/)%].74YU*@!.50``2.<,,"1M`!`@;0`(2J@`K&<8(&T`""`H)
  653. M`*SE@"@`($0@*``0Y8`F0&`$)FR"JA`32(!(P-"M``Q4@#E`@N)"IS`L@N)(`
  654. MP"\`3KH.#"E`@N103V8(3-\,,$Y=3G40$TB`.@`_!2!+4H@O""\L@N1.N@%^O
  655. M,`5(P"!`T>R"Y$/Z`400V6;\/RT`#B\*+RR"Y$ZZ`3H@;(+D0C!0`#E\``&"P
  656. MX#`%2,#0K(+D)D!2BR1+3^\`%!`32(`Z`+!\`"!G&+I\``EG$KI\``QG#+I\6
  657. M``UG!KI\``IF!%*+8-@,$P`@;7H,$P`B9BY2BR!+4HL0$$B`.@!G'B!*4HH06
  658. MA;I\`")F$`P3`")F!%*+8`9"*O__8`)@UF`X($M2BQ`02(`Z`&<FNGP`(&<@O
  659. MNGP`"6<:NGP`#&<4NGP`#6<.NGP`"F<(($I2BA"%8,X@2E**0A!*168"4XM2L
  660. M;(+@8`#_6D(20J<P+(+@4D!(P.6`+P!.N@SJ*4""W%!/9@A";(+@8`#^V'H`"
  661. M)FR"Y&`D,`5(P.6`(&R"W"&+"``@2R`(2AAF_)'`4X@P"%)`2,#7P%)%NFR"G
  662. MX&W6,`5(P.6`(&R"W$*P"`!@`/Z4(``P/'__8`0P+P`,(&\`!$H89OQ32")OW
  663. M``A30!#95\C__&<"0A`@+P`$3G5,[P,```0@"#(O``Q@`A#95\G__&<&4D%@,
  664. M`D(84<G__$YU2.=P`#0!Q,`F`4A#QL!(0T)#U(-(0,#!2$!"0-""3-\`#DYU,
  665. M3E4``$CG#C`D;0`(0J=(>@".3KH,3"E`@NA03V8(3-\,<$Y=3G4@;0`,(F@`:
  666. M)"\I``1.N@Q\*`!83V=22'H`;2!$+R@`-DZZ#$XF0$J`4$]G-$AX`^TO"TZZV
  667. M"VPL`%!/9R0@!N6`*@`@125H``@`I"5&`)Q(>`/M2'H`.$ZZ"T@E0`"@4$\O_
  668. M!$ZZ#!I83R\L@NA.N@M^0JR"Z%A/8(!I8V]N+FQI8G)A<GD`5TE.1$]7`"H`<
  669. M3E4``$AM``PO+0`(2'H$8$ZZ`)A/[P`,3EU.=4Y5``!(YP@@)&T`#@QM``0`<
  670. M$F8((&T`""@08!Q*;0`,;PP@;0`(<``P$"@`8`H@;0`(,!!(P"@`0FT`$DIM;
  671. M``QL$$1M``Q*A&P(1(0[?``!`!(R+0`,2,$@!$ZZ`Y!![(!<4XH4L```,BT`5
  672. M#$C!(`1.N@.&*`!FVDIM`!)G!E.*%+P`+2`*3-\$$$Y=3G5.5?\B2.<(,"1M5
  673. M``@F;0`,0FW_^BMM`!#__"!+4HL0$$B`.`!G``+NN'P`)68``LQ"+?\P.WP`3
  674. M`?_X.WP`(/_V.WPG$/_T($M2BQ`02(`X`+!\`"UF#D)M__@@2U*+$!!(@#@`H
  675. MN'P`,&80.WP`,/_V($M2BQ`02(`X`+A\`"IF&"!M__Q4K?_\.U#_\B!+4HL02
  676. M$$B`.`!@,D)M__)@'#`M__+!_``*T$20?``P.T#_\B!+4HL0$$B`.``P!%)`]
  677. M0>R`;@@P``(``&;4N'P`+F9:($M2BQ`02(`X`+!\`"IF&"!M__Q4K?_\.U#_[
  678. M]"!+4HL0$$B`.`!@,D)M__1@'#`M__3!_``*T$20?``P.T#_]"!+4HL0$$B`1
  679. M.``P!%)`0>R`;@@P``(``&;4.WP``O_PN'P`;&82($M2BQ`02(`X`#M\``3_O
  680. M\&`0N'P`:&8*($M2BQ`02(`X`#`$2,!@>CM\``C_[F`6.WP`"O_N8`X[?``0O
  681. M_^Y@!CM\__;_[C\M__!(;?\P/RW_[B\M__Q.NOWD*T#_ZC`M__!(P-&M__Q/T
  682. M[P`,8%P@;?_\6*W__")0*TG_ZB`)2AEF_)/`4XD[2?_P8$H@;?_\5*W__#@04
  683. M0>W_+RM(_^H0A&`HD+P```!C9^)3@&>2D+P````+9P#_<EF`9[)5@&<`_W!7[
  684. M@&<`_W)@S$'M_S"1[?_J.TC_\#`M__"P;?_T;P8[;?_T__!*;?_X9V@@;?_J(
  685. M#!``+6<*(&W_Z@P0`"MF+@QM`##_]F8F4VW_\B!M_^I2K?_J$!!(@#\`3I*P[
  686. M?/__5$]F"G#_3-\,$$Y=3G5@%C\M__9.DK!\__]43V8$</]@Y%)M__HP+?_R8
  687. M4VW_\K!M__!NW$)M_^Y@("!M_^I2K?_J$!!(@#\`3I*P?/__5$]F!'#_8+!20
  688. M;?_N(&W_ZDH09PHP+?_NL&W_]&W.,"W_[M%M__I*;?_X9BA@&#\\`"!.DK!\,
  689. M__]43V8&</]@`/]X4FW_^C`M__)3;?_RL&W_\&[:8!8_!$Z2L'S__U1/9@9P@
  690. M_V``_U)2;?_Z8`#]"#`M__I@`/]"2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!B
  691. M83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A4
  692. M$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`*
  693. M,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!14
  694. MRO_R3-\`#$YU3E4``$AL@08_+0`(3KH`"%Q/3EU.=4Y5```O!#@M``@O+0`*9
  695. M/P1.N@`PN'P`"EQ/9B0@;0`*$"@`#$B`"```!V<4/SS__R\M``I.N@#T7$\H)
  696. M'TY=3G5@^$Y5```O"B1M``H@4K'J``1E&#`M``C`?`#_/P`O"DZZ`,A<3R1?`
  697. M3EU.=2!24I(0+0`)$(!(@,!\`/]@Z$Y5```O"D'L@/`D2"!*U?P````6+PAAS
  698. M$%A/0>R"J+7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU,
  699. M2BH`#&=0""H``@`,9PP_//__+PIA4C@`7$\0*@`-2(`_`$ZZ!1R(0`@J``$`D
  700. M#%1/9PHO*@`(3KH"+EA/""H`!0`,9Q(O*@`23KH"P"\J`!).N@(44$]"DD*JY
  701. M``1"J@`(0BH`##`$8)!.5?_^2.<(("1M``A!^O]&*4B"[`@J``0`#&<*</],Q
  702. MWP003EU.=0@J``(`#&<P(%*1Z@`(.`@_!"\J``@0*@`-2(`_`$ZZ`H"P1%!/\
  703. M9Q`(Z@`$``Q"DD*J``1P_V#`#&W__P`,9A`(J@`"``Q"DD*J``1P`&"H2JH`U
  704. M"&8(+PI.N@":6$\,:@`!`!!F*AMM``W__S\\``%(;?__$"H`#4B`/P!.N@(B+
  705. ML'P``5!/9J`P+0`,8`#_:B2J``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0=
  706. M+0`-$(!(@,!\`/]@`/\^3E4``"\*0>R`\"1(2BH`#&<8U?P````60>R"J+7()
  707. M90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(/SP$`$ZZ`,`K>
  708. M0/_\5$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJ``$`#"5M?
  709. M__P`"!`J``U(@#\`3KH`XDI`5$]G!@`J`(``#&#.3E4``$CG`#`D;(*^8!0FE
  710. M4B`J``10@"\`+PI.N@1.4$\D2R`*9NA"K(*^3-\,`$Y=3G5.50``+PI!^O_&G
  711. M*4B"\$*G("T`"%"`+P!.N@/\)$!*@%!/9@AP`"1?3EU.=22L@KXE;0`(``0I:
  712. M2H*^(`I0@&#F3E4``'``,"T`""\`8;)83TY=3G5.50``2.<`,)?+)&R"OF`.[
  713. M(&T`"%&(L<IG$B9*)%(@"F;N</],WPP`3EU.=2`+9P0FDF`$*5*"OB`J``10E
  714. M@"\`+PI.N@.@<`!03V#83E4``"\*,"T`",'\``8D0-7L@LY*;0`(;0XP+0`(R
  715. ML&R"J&P$2I)F#CE\``*"]'#_)%].74YU,"T`",'\``8@;(+.+S`(`$ZZ`L9*8
  716. M@%A/9P1P`6`"<`!@V$Y5```O+0`(3KH"D$J`6$]F#DZZ`IHY0(+T</].74YU#
  717. M<`!@^$Y5``!(YPP@."T`"$ZZ`'`P!,'\``8D0-7L@LY*1&T*N&R"J&P$2I)F<
  718. M$#E\``*"]'#_3-\$,$Y=3G4P*@`$P'P``V8*.7P`!8+T</]@Y'``,"T`#B\`S
  719. M+RT`"B\23KH"9BH`L+S_____3^\`#&8,3KH"&CE`@O1P_V"X(`5@M$Y5__Q(>
  720. M>!``0J=.N@+**T#__`@```Q03V<22FR"UF8(("W__$Y=3G5.N@`&<`!@]$Y5^
  721. M``!(>``$2'H`'$ZZ`?`O`$ZZ`@(_/``!3KH`#D_O``Y.74YU7D,*`$Y5``!*Z
  722. MK(+L9P8@;(+L3I`_+0`(3KH`"%1/3EU.=4Y5__PO!#`M``A(P"M`__Q*K(+.>
  723. M9RAX`&`*/P1.N@#^5$]21+AL@JAM\#`L@JC!_``&+P`O+(+.3KH![%!/2JR"-
  724. M\&<&(&R"\$Z02JR"KF<*+RR"KDZZ`6A83TJL@O9G""!L@O8@K(+Z2JR"_F<*#
  725. M+RR"_DZZ`8183TJL@P)G"B\L@P).N@%T6$]*K(,&9PHO+(,&3KH!9%A/2JR#@
  726. M"F<*+RR#"DZZ`5183RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS!
  727. M2JR"V&8P2JR"Y&<H,"R"XDC`+P`O+(+D3KH!1#`L@N!20$C`Y8`O`"\L@MQ.)
  728. MN@$P3^\`$&`.3KH!'B\L@MA.N@%*6$\@+?_\+FR"PDYU*!].74YU3E4``$CGM
  729. M#B`X+0`(,`3!_``&)$#5[(+.2D1M"KAL@JAL!$J29A`Y?``"@O1P_TS?!'!.E
  730. M74YU""H`!P`$9@@O$DZZ``I83T*2<`!@XB(O``0L;(+*3N[_W"(O``0L;(+*4
  731. M3N[_@B(O``0L;(+*3N[_N"QL@LI.[O_*+&R"RD[N_WPB+P`$+&R"RD[N_RA,5
  732. M[P`&``0L;(+*3N[_XBQL@LI.[O_$3OH``B(O``0L;(+*3N[_IDSO``X`!"QLF
  733. M@LI.[O_02.<!!$SO((``#"QL@L9.KO^43-\@@$YU3OH``B)O``0L;(+&3N[^H
  734. M8DSO``,`!"QL@L9.[O\Z(F\`!"QL@L9.[O[:+&R"QD[N_WPB;P`$("\`""QL=
  735. M@L9.[O\N(&\`!"QL@L9.[OZ,+&R"QB)O``0@+P`(3N[]V")O``0L;(+&3N[^V
  736. MADSO``,`!"QL@L9.[O[.(&\`!"QL@L9.[OZ`3.\#```$+&R"Z$[N_Z`@;P`$/
  737. M+&R"Z$[N_Z8@;P`$+&R"Z$[N_[(```/L`````0````````#P`````0````$`'
  738. M``WV`````````_(```/J````K``!":`````!":H````!";0````!";X````!V
  739. M#/,````!#1$````!#1(`````04)#1$5&86)C9&5F.3@W-C4T,S(Q,``*"PP-C
  740. M#@\*"PP-#@\)"`<&!00#`@$``#`Q,C,T-38W.#EA8F-D968````@("`@("`@7
  741. M("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`0$!`0$!`0$!`0$`,#`P,P
  742. M#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!`0$!`0$!0$!`0$!`2
  743. M"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`(``````````````````!%
  744. M``````$``````````````````````0$````!``````````````````````$"'
  745. M`````0``````````````````````````````````````````````````````!
  746. M`````````````````````````````````````````````````````````````
  747. M`````````````````````````````````````````````````````````````
  748. M`````````````````````````````````````````````````````````````
  749. M`````````````````````````````````````````````````````````````
  750. M`````````````````````````````````````````````````````````````
  751. M`````````````````````````````````````````````````````````````
  752. M`````````````````````````````````````````````````````````````
  753. M```````````````````````````````4``````````````/R```#ZP````$`X
  754. #``/RU
  755. ``
  756. end
  757. size 8508
  758. SHAR_EOF
  759. #    End of shell archive
  760. exit 0
  761. -- 
  762. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  763. Have five nice days.
  764.